import {ObjectUtil} from "/@/utils/ObjectUtil";

export class ArrayUtil {
    /**
     * 判断两数组字符串是否相同（用于按钮权限验证），忽略数组元素顺序进行比较两个数组是否相同
     * @returns 两数组相同返回 `true`，反之则反
     * @param newArr
     * @param oldArr
     */
    static equal(newArr: unknown[] | string[], oldArr: unknown[] | string[]): boolean {
        if (!Array.isArray(newArr) || !Array.isArray(oldArr)) {
            return false;
        }
        // 对两个数组进行排序
        const sortedA = Array.from(new Set(newArr)).sort();
        const sortedB = Array.from(new Set(oldArr)).sort();
        // 判断两个数组是否相等
        if (sortedA.length !== sortedB.length) {
            return false;
        }
        for (let i = 0; i < sortedA.length; i++) {
            if (!ObjectUtil.equal(sortedA[i], sortedB[i])) {
                return false;
            }
        }
        return true;
    }

    /**
     * 数组去重
     * @param arr 要去重的数组
     * @param key 对象属性的键名（可选）
     * @returns 去重后的数组
     */
    static unique<T extends Record<string, any>>(arr: T[], key?: keyof T): T[] {
        if (!key) {
            // 如果没传 key，直接使用 Set 去重
            return Array.from(new Set(arr));
        }
        const seenKeys = new Set();
        return arr.filter(item => {
            const value = item[key];
            if (seenKeys.has(value)) {
                return false;
            } else {
                seenKeys.add(value);
                return true;
            }
        });
    }
}
